package com.tarena.rabbitmq.test;

import com.rabbitmq.client.*;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
 * 做消费接收代码测试
 */
public class DemoConsumer {
    //需要连接对象
    private Connection connection;
    @Before
    public void init(){
        ConnectionFactory factory=new ConnectionFactory();
        //配置当前rabbitmq的连接属性
        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setUsername("guest");//guest 只能使用 localhost识别
        factory.setPassword("guest");
        factory.setVirtualHost("/");
        try {
            connection=factory.newConnection();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //消费接收的逻辑
    @Test
    public void consume01() throws IOException {
        //1.消费监听的代码片段,需要拿到连接通道
        Channel channel = connection.createChannel();
        //2.消费的api
        //可以使用lamda表达式 但是lamda表达式 不适合初学oop(面相对象)编程的理解
        DeliverCallback deliverCallback=new DeliverCallback() {
            //当前消费代码判断 拿到rabbitmq中的消费的消息才会调用 没消息不调用

            /**
             * @param consumerTag 当前deliverCallback所属的消费者对象表示
             * @param message rabbitmq投递过来的消息对象
             */
            @Override
            public void handle(String consumerTag, Delivery message) throws IOException {
                System.out.println("当前 接收 的消费者:"+consumerTag);
                //解析消息,拿到二进制,根据发送的信息 反向解析--反序列化过程
                String msg=new String(message.getBody(), StandardCharsets.UTF_8);
                System.out.println("消费者01拿到消息:"+msg);
                //消费完毕 手动确认
                channel.basicAck(message.getEnvelope().getDeliveryTag(),false);
            }
        };
        CancelCallback cancelCallback=new CancelCallback() {
            @Override
            public void handle(String consumerTag) throws IOException {
                //TODO
            }
        };
        //建立连接,建立订阅监听
        /*
            queue: String类型参数 表示消费者监听的 队列名称
            autoAck: Boolean类型参数 表示消费接收到消息后 是否自动确认(确认机制)
            deliverCallback: 消费者接收到消息的回调接口 消息达到消费者的时候
            cancelCallback: 消费者取消消费的时候回调的接口 消费者断开连接的时候
         */
        channel.basicConsume("queue01",false,deliverCallback,cancelCallback);
        //junit框架 test方法运行结束 程序结束了,为了更清晰观察消费者功能,写一个死循环 让程序不消失
        while(true);
    }
}
